﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace common
{
    #region 将异常作为事件响应
    public delegate void D_CallBack(object sender, MyEventArgs e);

    public class MyEventArgs : System.EventArgs
    {
        private string object_I;
        public string Object_I
        {
            get { return object_I; }
            set { object_I = value; }
        }
    }
    #endregion

    #region 缓冲消息 用于控制速度
    /// <summary>
    /// 实现一个共享区数据类型.
    /// 自定义队列，使用List<>实现了队列的操作
    /// </summary>
    public class wk_Queue
    {
        private List<object> myArray;
        private int _count = 0;      //统计缓冲取当前个数
        private int _ReadCount = 0;  //统计从队列中读取的数量;
        private int _WriteCount = 0; //统计写入队列的个数;
        private Mutex QueueLock = new Mutex();

        #region 属性
        public int Count
        {
            get { return _count; }
            set { _count = value; }
        }
        public int WriteCount
        {
            get { return _WriteCount; }
            set { _WriteCount = value; }
        }

        public int ReadCount
        {
            get { return _ReadCount; }
            set { _ReadCount = value; }
        }
        #endregion

        /// <summary>
        /// 初始化一个队列对象
        /// 前提：无
        /// 结果：将队列对象初始化
        /// </summary>
        public wk_Queue()
        {
            myArray = new List<object>();
        }
        /// <summary>
        /// 向队列中加入一个元素
        /// 前提：无
        /// 结果：将一个元素加入到队列的末尾
        /// </summary>
        /// <param name="obj">
        /// 将要加入队列中的元素
        /// </param>
        public void inQueue(object obj)
        {
            this.Count++;
            this.WriteCount++;
            myArray.Add(obj);
        }
        /// <summary>
        /// 得到队列的第一个元素
        /// </summary>
        /// <returns>
        /// 返回队列中的第一个元素
        /// </returns>
        public object getFirst()
        {
            return myArray[0];
        }
        /// <summary>
        /// 移除队列中的第一个元素，并将其返回  如果没有取到数据 返回NULL
        /// 结果：删除队列的第一个元素，并将其返回
        /// </summary>
        /// <returns>
        /// 非空队列的队头元素
        /// </returns>
        public object outQueue()
        {
            if (myArray.Count != 0)
            {
                this.Count = Count - 1 < 0 ? 0 : Count - 1;
                this.ReadCount++;
                object temp = null;
                try
                {
                    temp = myArray[0];
                    myArray.RemoveAt(0);
                }
                catch
                {
                    return null;
                }
                return temp;
            }
            else
            {
                return null;
            }
        }
    }
    #endregion
}
